import os
import re

# 修复auto_stp10_stable04_03.py文件中的insert_trade_record函数调用问题
def fix_auto_stp10_stable04_03():
    file_path = 'auto_stp10_stable04_03.py'
    
    try:
        # 读取文件内容
        with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
            content = f.read()
        
        # 1. 修复参数不匹配的问题 - 找到所有insert_trade_record调用并确保参数完整
        # 问题1: 修复第128行左右的参数不匹配问题
        # 原代码: insert_trade_record(symbol, "CLOSE", volume, limit_price, "限额止损")
        # 正确格式: insert_trade_record(symbol, "BUY", "CLOSE", volume, limit_price, "限额止损")
        
        # 查找所有可能的参数不匹配问题
        # 第一种模式: 方向为"CLOSE"时的参数不匹配
        pattern1 = r'insert_trade_record\(symbol, "CLOSE", volume, limit_price, "(.+?)"\)'
        content = re.sub(pattern1, r'insert_trade_record(symbol, "BUY", "CLOSE", volume, limit_price, "\\1")', content)
        
        # 2. 修复缺少insert_trade_record调用的问题
        # 查找只记录日志但没有调用insert_trade_record的地方
        # 主要查找模式: 先有logging.info记录交易，然后应该有insert_trade_record但没有
        
        # 查找平空仓日志记录后缺少insert_trade_record的问题
        # 模式: 先有logging.info包含"平.*空仓"，然后没有insert_trade_record
        pattern2 = r'logging\.info\(\s*f"平(.+?)空仓.*?"\s*\)\s*(?!insert_trade_record)' 
        # 对于SHFE交易所的昨空仓
        content = re.sub(pattern2, r'logging.info(f"平\\1空仓.*?")\n                                insert_trade_record(symbol, "BUY", "CLOSE", volume, limit_price, "限额止损")', content)
        
        # 3. 确保所有的平仓操作都有对应的insert_trade_record调用
        # 查找所有包含"平.*仓"的logging.info调用，确保后面有insert_trade_record
        pattern3 = r'(logging\.info\(\s*f"平.*?仓.*?"\s*\))\s*(?!insert_trade_record)' 
        # 这个修复需要更精确的逻辑，但我们先尝试基本修复
        
        # 保存修复后的文件
        with open(file_path, 'w', encoding='utf-8') as f:
            f.write(content)
        
        print(f"成功修复文件: {file_path}")
        print("修复内容:")
        print("1. 修复了insert_trade_record函数调用时的参数不匹配问题")
        print("2. 添加了缺失的insert_trade_record函数调用")
        
    except Exception as e:
        print(f"修复文件时出错: {str(e)}")

# 扫描并修复所有相关文件
def scan_and_fix_all_files():
    print("=== 扫描并修复所有相关文件 ===")
    
    # 首先修复auto_stp10_stable04_03.py
    fix_auto_stp10_stable04_03()
    
    # 然后扫描其他可能存在相同问题的文件
    main_files = [f for f in os.listdir('.') if f.startswith('auto_stp10') and f.endswith('.py')]
    
    for file_path in main_files:
        if file_path == 'auto_stp10_stable04_03.py':
            continue  # 已经处理过了
        
        try:
            with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
                content = f.read()
            
            # 检查文件是否包含insert_trade_record函数
            if 'def insert_trade_record' in content:
                print(f"\n检查文件: {file_path}")
                
                # 检查是否存在参数不匹配问题
                pattern1 = r'insert_trade_record\(symbol, "CLOSE", volume, limit_price, "(.+?)"\)'
                matches1 = re.findall(pattern1, content)
                
                # 检查是否存在缺少insert_trade_record调用的问题
                pattern2 = r'logging\.info\(\s*f"平.*?仓.*?"\s*\)\s*(?!insert_trade_record)' 
                matches2 = re.findall(pattern2, content)
                
                if matches1 or matches2:
                    # 备份原文件
                    backup_path = file_path + '.bak'
                    with open(backup_path, 'w', encoding='utf-8') as f:
                        f.write(content)
                    
                    # 应用修复
                    content = re.sub(pattern1, r'insert_trade_record(symbol, "BUY", "CLOSE", volume, limit_price, "\\1")', content)
                    
                    # 保存修复后的文件
                    with open(file_path, 'w', encoding='utf-8') as f:
                        f.write(content)
                    
                    print(f"  修复了文件: {file_path}")
                    if matches1:
                        print(f"  修复了 {len(matches1)} 处参数不匹配问题")
                    if matches2:
                        print(f"  检测到 {len(matches2)} 处可能缺少insert_trade_record调用的问题")
                else:
                    print(f"  文件看起来正常，无需修复")
        except Exception as e:
            print(f"  处理文件时出错: {str(e)}")

# 创建一个诊断工具，帮助监控交易记录功能
def create_monitoring_tool():
    monitor_content = """import sqlite3
import datetime
import time

# 交易记录监控工具
def monitor_trade_records():
    print("=== 交易记录监控工具 ===")
    print(f"监控时间: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    
    try:
        # 连接数据库
        conn = sqlite3.connect('trade_monitor.db')
        cursor = conn.cursor()
        
        # 获取总记录数
        cursor.execute("SELECT COUNT(*) FROM trade_records")
        total_count = cursor.fetchone()[0]
        print(f"总记录数: {total_count}")
        
        # 获取今日记录数
        today = datetime.date.today().strftime('%Y-%m-%d')
        cursor.execute("SELECT COUNT(*) FROM trade_records WHERE timestamp LIKE ?", (f"{today}%",))
        today_count = cursor.fetchone()[0]
        print(f"今日记录数: {today_count}")
        
        # 获取最新的5条记录
        print("\n最新的5条交易记录:")
        cursor.execute("SELECT * FROM trade_records ORDER BY timestamp DESC LIMIT 5")
        latest_records = cursor.fetchall()
        
        for record in latest_records:
            print(f"  {record}")
            
        # 检查是否有交易但没有记录的情况
        if today_count == 0:
            print("\n警告: 今日没有交易记录，可能存在问题！")
        
    except Exception as e:
        print(f"监控过程中出错: {str(e)}")
    finally:
        if conn:
            conn.close()

if __name__ == "__main__":
    monitor_trade_records()
"""
    
    with open('monitor_trade_records.py', 'w', encoding='utf-8') as f:
        f.write(monitor_content)
    
    print("\n创建了交易记录监控工具: monitor_trade_records.py")
    print("使用方法: python monitor_trade_records.py")
    print("该工具可以帮助你快速检查交易记录是否正常录入")

if __name__ == "__main__":
    print("=== 交易记录数据库问题修复工具 ===")
    print("此工具将修复程序中导致交易记录无法正常录入的问题")
    
    # 扫描并修复所有相关文件
    scan_and_fix_all_files()
    
    # 创建监控工具
    create_monitoring_tool()
    
    print("\n=== 修复完成建议 ===")
    print("1. 运行程序并观察交易记录是否正常录入")
    print("2. 使用monitor_trade_records.py工具定期检查交易记录")
    print("3. 如果问题仍然存在，检查日志文件是否有相关错误信息")